#include "VOFA.h"
float my_atof(const char *str);
typedef union {
  float fdata;
  int idata;
  short sdata;
  uint32_t ldata;
} LongType;

void Float_to_Byte(float f, unsigned char byte[]) {
  LongType fl;
  fl.fdata = f;
  byte[0] = (unsigned char)fl.ldata;
  byte[1] = (unsigned char)(fl.ldata >> 8);
  byte[2] = (unsigned char)(fl.ldata >> 16);
  byte[3] = (unsigned char)(fl.ldata >> 24);
}

void vofa_data(float f) {
  unsigned char byte[4] = {0};

  Float_to_Byte(f, byte);
  UART0_Console_write(byte, 4);
  delay_ms(1);
}

void vofa_tail(void) {
  unsigned char byte[4] = {0x00, 0x00, 0x80, 0x7f};

  UART0_Console_write(byte, 4);
  delay_ms(1);
}

/*
 *用户无需修改
 */
#define VOFA_RXSIZE 256
uint8_t vofa_rx_cnt = 0;
uint8_t vofa_rx_buff;
unsigned char shujv[12];
int vofa_i = 0, vofa_I = 0;
float vofa_float;

volatile bool gConsoleTxDMATransmitted = false;
volatile bool gConsoleTxTransmitted = false;

/*
 *用户增添变量区
 */
float p;

/*************************************************************************
 *  函数名称：void vofa_send(void)
 *  功能说明：发送数据
 *  参数说明：无
 *  函数返回：无
 *  修改时间：2024年8月22日
 *  备    注：
 *************************************************************************/
void vofa_send(void) {
  // 在此处添加发送变量
  //   printf("%.3f,%.3f,
  //   %.3f,%d,%d,%f\r\n",Angle_Yaw,Gyroscope.inner_expect,Car_Direction.out,distance_intaral,average_speed,Gyro_z);
//  printf("%.3f\r\n", Angle_Yaw);
//	for (int i = 0; i < 4; i++) {
//  printf("Outer[%d] = (%d, %d)\r\n", i, rect.Outer_Rect[i].x, rect.Outer_Rect[i].y);
//}
//for (int i = 0; i < 4; i++) {
//  printf("Inter[%d] = (%d, %d)\r\n", i, rect.Inter_Rect[i].x, rect.Inter_Rect[i].y);
//}
//printf("Laser = (%d, %d)\r\n", laser.Green_Laser.x, laser.Green_Laser.y);
	
  //    vofa_data(Angle_Yaw);
  //	  vofa_tail();
}

/*************************************************************************
 *  函数名称：void UART_0_INST_IRQHandler(void)
 *  功能说明：接收数据
 *  参数说明：无
 *  函数返回：无
 *  修改时间：2024年8月22日
 *  备    注：串口0中断服务函数
 *************************************************************************/
void UART_0_INST_IRQHandler(void) {
  uint8_t dat;
  switch (DL_UART_Main_getPendingInterrupt(UART_0_INST)) {
  case DL_UART_MAIN_IIDX_RX:
	origin_data = DL_UART_Main_receiveData(UART_0_INST);
	IMU_uart_callback();
		
	
//    vofa_rx_buff = DL_UART_Main_receiveData(UART_0_INST);
//    if (vofa_rx_cnt >= VOFA_RXSIZE - 1) {
//      vofa_rx_cnt = 0;
//    } else {
//      dat = vofa_rx_buff;

//      shujv[vofa_I++] = dat;
//      int i = 0;
//      if (dat == 0x0A) {
//        for (i = 1; i < vofa_I; i++) {
//          if (shujv[i] == 0x2E)
//            break;
//        }
//        if (i != vofa_I) {
//          int j;
//          for (vofa_i = 2, vofa_float = 0; vofa_i < i; vofa_i++)
//            vofa_float = 10 * vofa_float + (shujv[vofa_i] - '0');

//          for (j = vofa_i + 1; j <= vofa_I - 2; j++)
//            vofa_float += (shujv[j] - '0') * 0.1;
//        } else if (i == vofa_I) {
//          for (vofa_i = 2, vofa_float = 0; vofa_i < vofa_I - 1; vofa_i++)
//            vofa_float = 10 * vofa_float + (shujv[vofa_i] - '0');
//        }
//        vofa_I = 0;
//        if (shujv[1] == 0x3A) {
//          switch (shujv[0]) {
//          // 在此添加接收变量
//          case 'p':
//            p = vofa_float;
//            break;
//          }
//        }
//        vofa_rx_cnt = 0;
//      }
//    }

//    break;

//  // 串口发送完成
//  case DL_UART_MAIN_IIDX_EOT_DONE:
//    gConsoleTxTransmitted = true;
//    break;
//  // DMA搬运完成
//  case DL_UART_MAIN_IIDX_DMA_DONE_TX:
//    gConsoleTxDMATransmitted = true;
    break;
  default:
    break;
  }
}
// 2025

/*************************************************************************
 *  函数名称：void uart_0_init(void)
 *  功能说明：串口0初始化
 *  参数说明：无
 *  函数返回：无
 *  修改时间：2024年8月22日
 *  备    注：主要就是看有无打印UART_0 init OK!
 *************************************************************************/
void uart_0_init(void) {
  // 串口0初始化
  NVIC_ClearPendingIRQ(UART_0_INST_INT_IRQN);
  // 使能DMA通道
  DL_DMA_enableChannel(DMA, DMA_CH0_CHAN_ID);
  // 开启UART中断
  NVIC_EnableIRQ(UART_0_INST_INT_IRQN);
  printf("UART_0 init OK!\r\n");
}

void uart_2_init() {
  NVIC_ClearPendingIRQ(UART_2_INST_INT_IRQN);
  // 使能串口中断
  NVIC_EnableIRQ(UART_2_INST_INT_IRQN);
}
	
/*************************************************************************
 *  函数名称：void UART0_Console_write(uint8_t *data, uint16_t size)
 *  功能说明：DMA串口发送函数
 *  参数说明：无
 *  函数返回：无
 *  修改时间：2024年8月22日
 *  备    注：
 *************************************************************************/
void UART0_Console_write(uint8_t *data, uint16_t size) {
  // 当串口发送完毕后，才可再次发送
  if (gConsoleTxTransmitted) {
    // 设置源地址
    DL_DMA_setSrcAddr(DMA, DMA_CH0_CHAN_ID, (uint32_t)(data));

    // 设置目标地址
    DL_DMA_setDestAddr(DMA, DMA_CH0_CHAN_ID, (uint32_t)(&UART_0_INST->TXDATA));

    // 设置要搬运的字节数
    DL_DMA_setTransferSize(DMA, DMA_CH0_CHAN_ID, size);

    // 使能DMA通道
    DL_DMA_enableChannel(DMA, DMA_CH0_CHAN_ID);

    gConsoleTxTransmitted = false;
    gConsoleTxDMATransmitted = false;
  }
}

// 串口使用
uint8_t Serial_TxPacket[4]; // 定义发送数据包数组，数据包格式：FF 01 02 03 04 FE
uint8_t Serial_RxPacket[64]; // 定义接收数据包数组
uint8_t Serial_RxFlag;       // 定义接收数据包标志位
// k230数据

float current_distance;
char current_label[MAX_LABEL_LEN];
uint8_t str_1[20];

void UART_2_INST_IRQHandler(void) {
  static uint8_t RxState = 0;   // 定义表示当前状态机状态的静态变量
  static uint8_t pRxPacket = 0; // 定义表示当前接收数据位置的静态变量
  // 如果产生了串口中断
  switch (DL_UART_getPendingInterrupt(UART_2_INST)) {
  case DL_UART_IIDX_RX: // 如果是接收中断
    // 接发送过来的数据保存在变量中
    uint8_t RxData = DL_UART_Main_receiveData(
        UART_2_INST); // 读取数据寄存器，存放在接收的数据变量
    if (RxState == 0) {
      if (RxData == '@' && Serial_RxFlag == 0) // 如果数据确实是包头
      {
        RxState = 1;   // 置下一个状态
        pRxPacket = 0; // 数据包的位置归零
      }
    } else if (RxState == 1) // 收到包尾
    {
      if (RxData == '#') {
        RxState = 2;
      } else {
        Serial_RxPacket[pRxPacket] = RxData; // 将数据存入数据包数组的指定位置
        pRxPacket++;                         // 数据包的位置自增
      }
    }
    /*当前状态为2，接收数据包第二个包尾*/
    else if (RxState == 2) {
      if (RxData == '$') // 如果数据确实是包尾部
      {
        RxState = 0; // 状态归0
        Serial_RxPacket[pRxPacket] = '\0';        
				printf("Serial_RxPacket: %s\r\n", Serial_RxPacket);
        Serial_RxFlag = 1; // 接收数据包标志位置1，成功接收一个数据包
        break;

      default: // 其他的串口中断
        break;
      }
    }
  }
}

float my_atof(const char *str) {
  float result = 0.0f;
  float sign = 1.0f;
  float fraction = 0.1f;
  int has_dot = 0;

  // 处理前导空格
  while (*str == ' ')
    str++;

  // 处理符号
  if (*str == '-') {
    sign = -1.0f;
    str++;
  } else if (*str == '+') {
    str++;
  }

  // 主体部分
  while ((*str >= '0' && *str <= '9') || (*str == '.')) {
    if (*str == '.') {
      has_dot = 1;
      str++;
      continue;
    }

    int digit = *str - '0';
    if (!has_dot) {
      result = result * 10.0f + digit;
    } else {
      result += digit * fraction;
      fraction *= 0.1f;
    }
    str++;
  }

  return sign * result;
}
